package com.pai4j.aigc.llm;


import com.pai4j.domain.vo.llm.ChatCompletionMessage;
import com.pai4j.domain.vo.llm.ChatCompletionResponse;
import com.pai4j.domain.vo.llm.Usage;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.List;

/**
 *  抽象大模型对话服务
 *
 * @author: CYM-pai
 * @date: 2025/05/11 09:20
 **/
public abstract class AbstractLLMChatService {

    /**
     * 最近一次流式对话返回的使用量（由具体实现设置）。
     * 调用方在一次对话完成后通过 {@link #consumeLastUsage()} 获取并清空。
     */
    protected volatile Usage lastUsage;

    /**
     * 获取并清空最近一次记录的使用量。
     */
    public Usage consumeLastUsage() {
        Usage u = this.lastUsage;
        this.lastUsage = null;
        return u;
    }

    /**
     * 同步对话
     *
     * @param messageList
     * @return
     * @throws Exception
     */
    protected abstract ChatCompletionResponse chat(List<ChatCompletionMessage> messageList) throws Exception;

    /**
     * 可选的带配置对话钩子：默认调用无配置版本。
     * 子类可覆盖以支持动态 apiKey/model 覆盖。
     */
    protected ChatCompletionResponse chat(List<ChatCompletionMessage> messageList, Object config) throws Exception {
        return this.chat(messageList);
    }

    /**
     * 流式对话
     *
     * @param emitter
     * @param messageList
     * @return
     * @throws Exception
     */
    protected abstract String chat(SseEmitter emitter, List<ChatCompletionMessage> messageList) throws Exception;

    /**
     * 可选的带配置流式对话钩子：默认调用无配置版本。
     * 子类可覆盖以支持动态 apiKey/model/baseUrl 覆盖。
     */
    protected String chat(SseEmitter emitter, List<ChatCompletionMessage> messageList, Object config) throws Exception {
        return this.chat(emitter, messageList);
    }
}
